package com.zwh.se.oop.comprehensive;

import com.zwh.se.common.pojo.POJO;

/**
 * final 表示最终的意思，可以修饰类、方法、局部变量、成员变量。
 * <p>
 * 使用 final 方法的原因有两个。
 * 第一个原因：把方法锁定，以防任何继承类修改它的含义；
 * 第二个原因：效率。在早期的 Java 实现版本中，会将 final 方法转为内嵌调用。但是如果方法过于庞大，
 * 可能看不到内嵌调用带来的任何性能提升（现在的 Java 版本已经不需要使用 final 方法进行这些优化了）。
 * 类中所有的 private 方法都隐式地指定为 final。
 *
 * @author yexi
 */
//用 final 修饰一个类时，表明这个类不能被继承。final 类中的所有成员方法都会被隐式地指定为 final 方法。
public final class ClassToTestFinal {

    //被final修饰的变量,首先即便它放在成员变量的位置,也必须初始化才能使用。
//    且被final修饰的变量就变成常量了,常量只能赋值一次,不能再重新赋值,一旦在初始化之后便不能更改
    //约定俗成的规则：被final所修饰的变量被视作常量，而如果是常量则变量命名需要全部大写
    static final int A = 10;//基本数据类型：表示的值不能改变
    static final POJO POJO = new POJO(); //引用数据类型：所引用的地址值不能改变(也即不能再指向另外一个对象)


    //最终方法不能被重写
    public final void test() {
        System.out.println("test");
    }

    public static void main(String[] args) {
        //编译错误：无法将值赋给 final 变量 'A'
        //A = 11;
        //编译错误：无法将值赋给 final 变量 'POJO'
        //POJO = new POJO();
        //引用数据类型只是不能变更地址值,但成员变量还是可以变化的
        POJO.setAge(12);
        //局部变量也能被修饰为 final
        final String param= "";
        //无法将值赋给 final 变量
//        param = "test";
    }

}
